package com.atguigu.shardingjdbcdemo.algorithm;

import org.apache.shardingsphere.api.sharding.standard.PreciseShardingAlgorithm;
import org.apache.shardingsphere.api.sharding.standard.PreciseShardingValue;

import java.util.ArrayList;
import java.util.Collection;


/**
 * 自定义实现 精准分片算法（PreciseShardingAlgorithm）接口
 * 数据库DB的精准分片
 *
 * @author zzjx
 * @version 1.0
 * fileName PreciseShardingDBAlgorithm1
 * createTime 2021/10/20  19:21
 */
public class PreciseShardingDBAlgorithm implements PreciseShardingAlgorithm<Integer> {

    /**
     * @param databaseNames 有效的数据源 或者 表 的名字  databaseNames 就为配置文件中的 配置的数据源信息 -> ds0 , ds1
     * @param shardingValue SQL 分片列 对应的实际值
     * @return
     */
    @Override
    public String doSharding(Collection<String> databaseNames,
                             PreciseShardingValue<Integer> shardingValue) {

         // 作用：散列到具体的哪个库里面去
         // shardingValue ： SQL -> INSERT INTO  course VALUES (cid,user_id,cname)
         // 根据user_id 对总的数据源取余，奇数放在edu_db_1数据库  偶数放在edu_db_2数据库 (对应场景不同租户放在对应自己的数据库中)
         // 根据cid 来分表

        Collection<String> shardingDS = new ArrayList<>();
        for (String each : databaseNames) {

             //  此方法如果参数所表示的字符序列是由该对象表示的字符序列的后缀返回true, 否则为false;
             //  请注意，如果参数是空字符串或等于此String对象由equals（Object）方法确定结果为 true。
             //  String Str = new String("This is really not immutable!!");   retVal = Str.endsWith( "immutable!!" )
             //  为true
             //  ds0.startsWith("d") -> true ; d代表course类型数据库  u代表用户类型数据库

            for (String database : databaseNames) {
                if (database.startsWith("d")) {
                    shardingDS.add(database);
                }
            }
            //进行取余算法，偶数分到edu_db_1 奇数分到edu_db_2中去
            for (String sharding : shardingDS) {
                if (sharding.endsWith((shardingValue.getValue() % shardingDS.size()+""))){
                    return sharding;
                }
            }

        }
        throw new UnsupportedOperationException();
    }
}

